export enum StatusCodes {
   Good = 0x00000000,
   Uncertain = 0x40000000,
   Bad = 0x80000000,
   BadUnexpectedError = 0x80010000,
   BadInternalError = 0x80020000,
   BadOutOfMemory = 0x80030000,
   BadResourceUnavailable = 0x80040000,
   BadCommunicationError = 0x80050000,
   BadEncodingError = 0x80060000,
   BadDecodingError = 0x80070000,
   BadEncodingLimitsExceeded = 0x80080000,
   BadRequestTooLarge = 0x80B80000,
   BadResponseTooLarge = 0x80B90000,
   BadUnknownResponse = 0x80090000,
   BadTimeout = 0x800A0000,
   BadServiceUnsupported = 0x800B0000,
   BadShutdown = 0x800C0000,
   BadServerNotConnected = 0x800D0000,
   BadServerHalted = 0x800E0000,
   BadNothingToDo = 0x800F0000,
   BadTooManyOperations = 0x80100000,
   BadTooManyMonitoredItems = 0x80DB0000,
   BadDataTypeIdUnknown = 0x80110000,
   BadCertificateInvalid = 0x80120000,
   BadSecurityChecksFailed = 0x80130000,
   BadCertificatePolicyCheckFailed = 0x81140000,
   BadCertificateTimeInvalid = 0x80140000,
   BadCertificateIssuerTimeInvalid = 0x80150000,
   BadCertificateHostNameInvalid = 0x80160000,
   BadCertificateUriInvalid = 0x80170000,
   BadCertificateUseNotAllowed = 0x80180000,
   BadCertificateIssuerUseNotAllowed = 0x80190000,
   BadCertificateUntrusted = 0x801A0000,
   BadCertificateRevocationUnknown = 0x801B0000,
   BadCertificateIssuerRevocationUnknown = 0x801C0000,
   BadCertificateRevoked = 0x801D0000,
   BadCertificateIssuerRevoked = 0x801E0000,
   BadCertificateChainIncomplete = 0x810D0000,
   BadUserAccessDenied = 0x801F0000,
   BadIdentityTokenInvalid = 0x80200000,
   BadIdentityTokenRejected = 0x80210000,
   BadSecureChannelIdInvalid = 0x80220000,
   BadInvalidTimestamp = 0x80230000,
   BadNonceInvalid = 0x80240000,
   BadSessionIdInvalid = 0x80250000,
   BadSessionClosed = 0x80260000,
   BadSessionNotActivated = 0x80270000,
   BadSubscriptionIdInvalid = 0x80280000,
   BadRequestHeaderInvalid = 0x802A0000,
   BadTimestampsToReturnInvalid = 0x802B0000,
   BadRequestCancelledByClient = 0x802C0000,
   BadTooManyArguments = 0x80E50000,
   BadLicenseExpired = 0x810E0000,
   BadLicenseLimitsExceeded = 0x810F0000,
   BadLicenseNotAvailable = 0x81100000,
   BadServerTooBusy = 0x80EE0000,
   GoodPasswordChangeRequired = 0x00EF0000,
   GoodSubscriptionTransferred = 0x002D0000,
   GoodCompletesAsynchronously = 0x002E0000,
   GoodOverload = 0x002F0000,
   GoodClamped = 0x00300000,
   BadNoCommunication = 0x80310000,
   BadWaitingForInitialData = 0x80320000,
   BadNodeIdInvalid = 0x80330000,
   BadNodeIdUnknown = 0x80340000,
   BadAttributeIdInvalid = 0x80350000,
   BadIndexRangeInvalid = 0x80360000,
   BadIndexRangeNoData = 0x80370000,
   BadIndexRangeDataMismatch = 0x80EA0000,
   BadDataEncodingInvalid = 0x80380000,
   BadDataEncodingUnsupported = 0x80390000,
   BadNotReadable = 0x803A0000,
   BadNotWritable = 0x803B0000,
   BadOutOfRange = 0x803C0000,
   BadNotSupported = 0x803D0000,
   BadNotFound = 0x803E0000,
   BadObjectDeleted = 0x803F0000,
   BadNotImplemented = 0x80400000,
   BadMonitoringModeInvalid = 0x80410000,
   BadMonitoredItemIdInvalid = 0x80420000,
   BadMonitoredItemFilterInvalid = 0x80430000,
   BadMonitoredItemFilterUnsupported = 0x80440000,
   BadFilterNotAllowed = 0x80450000,
   BadStructureMissing = 0x80460000,
   BadEventFilterInvalid = 0x80470000,
   BadContentFilterInvalid = 0x80480000,
   BadFilterOperatorInvalid = 0x80C10000,
   BadFilterOperatorUnsupported = 0x80C20000,
   BadFilterOperandCountMismatch = 0x80C30000,
   BadFilterOperandInvalid = 0x80490000,
   BadFilterElementInvalid = 0x80C40000,
   BadFilterLiteralInvalid = 0x80C50000,
   BadContinuationPointInvalid = 0x804A0000,
   BadNoContinuationPoints = 0x804B0000,
   BadReferenceTypeIdInvalid = 0x804C0000,
   BadBrowseDirectionInvalid = 0x804D0000,
   BadNodeNotInView = 0x804E0000,
   BadNumericOverflow = 0x81120000,
   BadLocaleNotSupported = 0x80ED0000,
   BadNoValue = 0x80F00000,
   BadServerUriInvalid = 0x804F0000,
   BadServerNameMissing = 0x80500000,
   BadDiscoveryUrlMissing = 0x80510000,
   BadSemaphoreFileMissing = 0x80520000,
   BadRequestTypeInvalid = 0x80530000,
   BadSecurityModeRejected = 0x80540000,
   BadSecurityPolicyRejected = 0x80550000,
   BadTooManySessions = 0x80560000,
   BadUserSignatureInvalid = 0x80570000,
   BadApplicationSignatureInvalid = 0x80580000,
   BadNoValidCertificates = 0x80590000,
   BadIdentityChangeNotSupported = 0x80C60000,
   BadRequestCancelledByRequest = 0x805A0000,
   BadParentNodeIdInvalid = 0x805B0000,
   BadReferenceNotAllowed = 0x805C0000,
   BadNodeIdRejected = 0x805D0000,
   BadNodeIdExists = 0x805E0000,
   BadNodeClassInvalid = 0x805F0000,
   BadBrowseNameInvalid = 0x80600000,
   BadBrowseNameDuplicated = 0x80610000,
   BadNodeAttributesInvalid = 0x80620000,
   BadTypeDefinitionInvalid = 0x80630000,
   BadSourceNodeIdInvalid = 0x80640000,
   BadTargetNodeIdInvalid = 0x80650000,
   BadDuplicateReferenceNotAllowed = 0x80660000,
   BadInvalidSelfReference = 0x80670000,
   BadReferenceLocalOnly = 0x80680000,
   BadNoDeleteRights = 0x80690000,
   UncertainReferenceNotDeleted = 0x40BC0000,
   BadServerIndexInvalid = 0x806A0000,
   BadViewIdUnknown = 0x806B0000,
   BadViewTimestampInvalid = 0x80C90000,
   BadViewParameterMismatch = 0x80CA0000,
   BadViewVersionInvalid = 0x80CB0000,
   UncertainNotAllNodesAvailable = 0x40C00000,
   GoodResultsMayBeIncomplete = 0x00BA0000,
   BadNotTypeDefinition = 0x80C80000,
   UncertainReferenceOutOfServer = 0x406C0000,
   BadTooManyMatches = 0x806D0000,
   BadQueryTooComplex = 0x806E0000,
   BadNoMatch = 0x806F0000,
   BadMaxAgeInvalid = 0x80700000,
   BadSecurityModeInsufficient = 0x80E60000,
   BadHistoryOperationInvalid = 0x80710000,
   BadHistoryOperationUnsupported = 0x80720000,
   BadInvalidTimestampArgument = 0x80BD0000,
   BadWriteNotSupported = 0x80730000,
   BadTypeMismatch = 0x80740000,
   BadMethodInvalid = 0x80750000,
   BadArgumentsMissing = 0x80760000,
   BadNotExecutable = 0x81110000,
   BadTooManySubscriptions = 0x80770000,
   BadTooManyPublishRequests = 0x80780000,
   BadNoSubscription = 0x80790000,
   BadSequenceNumberUnknown = 0x807A0000,
   GoodRetransmissionQueueNotSupported = 0x00DF0000,
   BadMessageNotAvailable = 0x807B0000,
   BadInsufficientClientProfile = 0x807C0000,
   BadStateNotActive = 0x80BF0000,
   BadAlreadyExists = 0x81150000,
   BadTcpServerTooBusy = 0x807D0000,
   BadTcpMessageTypeInvalid = 0x807E0000,
   BadTcpSecureChannelUnknown = 0x807F0000,
   BadTcpMessageTooLarge = 0x80800000,
   BadTcpNotEnoughResources = 0x80810000,
   BadTcpInternalError = 0x80820000,
   BadTcpEndpointUrlInvalid = 0x80830000,
   BadRequestInterrupted = 0x80840000,
   BadRequestTimeout = 0x80850000,
   BadSecureChannelClosed = 0x80860000,
   BadSecureChannelTokenUnknown = 0x80870000,
   BadSequenceNumberInvalid = 0x80880000,
   BadProtocolVersionUnsupported = 0x80BE0000,
   BadConfigurationError = 0x80890000,
   BadNotConnected = 0x808A0000,
   BadDeviceFailure = 0x808B0000,
   BadSensorFailure = 0x808C0000,
   BadOutOfService = 0x808D0000,
   BadDeadbandFilterInvalid = 0x808E0000,
   UncertainNoCommunicationLastUsableValue = 0x408F0000,
   UncertainLastUsableValue = 0x40900000,
   UncertainSubstituteValue = 0x40910000,
   UncertainInitialValue = 0x40920000,
   UncertainSensorNotAccurate = 0x40930000,
   UncertainEngineeringUnitsExceeded = 0x40940000,
   UncertainSubNormal = 0x40950000,
   GoodLocalOverride = 0x00960000,
   GoodSubNormal = 0x00EB0000,
   BadRefreshInProgress = 0x80970000,
   BadConditionAlreadyDisabled = 0x80980000,
   BadConditionAlreadyEnabled = 0x80CC0000,
   BadConditionDisabled = 0x80990000,
   BadEventIdUnknown = 0x809A0000,
   BadEventNotAcknowledgeable = 0x80BB0000,
   BadDialogNotActive = 0x80CD0000,
   BadDialogResponseInvalid = 0x80CE0000,
   BadConditionBranchAlreadyAcked = 0x80CF0000,
   BadConditionBranchAlreadyConfirmed = 0x80D00000,
   BadConditionAlreadyShelved = 0x80D10000,
   BadConditionNotShelved = 0x80D20000,
   BadShelvingTimeOutOfRange = 0x80D30000,
   BadNoData = 0x809B0000,
   BadBoundNotFound = 0x80D70000,
   BadBoundNotSupported = 0x80D80000,
   BadDataLost = 0x809D0000,
   BadDataUnavailable = 0x809E0000,
   BadEntryExists = 0x809F0000,
   BadNoEntryExists = 0x80A00000,
   BadTimestampNotSupported = 0x80A10000,
   GoodEntryInserted = 0x00A20000,
   GoodEntryReplaced = 0x00A30000,
   UncertainDataSubNormal = 0x40A40000,
   GoodNoData = 0x00A50000,
   GoodMoreData = 0x00A60000,
   BadAggregateListMismatch = 0x80D40000,
   BadAggregateNotSupported = 0x80D50000,
   BadAggregateInvalidInputs = 0x80D60000,
   BadAggregateConfigurationRejected = 0x80DA0000,
   GoodDataIgnored = 0x00D90000,
   BadRequestNotAllowed = 0x80E40000,
   BadRequestNotComplete = 0x81130000,
   BadTransactionPending = 0x80E80000,
   BadTicketRequired = 0x811F0000,
   BadTicketInvalid = 0x81200000,
   BadLocked = 0x80E90000,
   BadRequiresLock = 0x80EC0000,
   GoodEdited = 0x00DC0000,
   GoodPostActionFailed = 0x00DD0000,
   UncertainDominantValueChanged = 0x40DE0000,
   GoodDependentValueChanged = 0x00E00000,
   BadDominantValueChanged = 0x80E10000,
   UncertainDependentValueChanged = 0x40E20000,
   BadDependentValueChanged = 0x80E30000,
   GoodEdited_DependentValueChanged = 0x01160000,
   GoodEdited_DominantValueChanged = 0x01170000,
   GoodEdited_DominantValueChanged_DependentValueChanged = 0x01180000,
   BadEdited_OutOfRange = 0x81190000,
   BadInitialValue_OutOfRange = 0x811A0000,
   BadOutOfRange_DominantValueChanged = 0x811B0000,
   BadEdited_OutOfRange_DominantValueChanged = 0x811C0000,
   BadOutOfRange_DominantValueChanged_DependentValueChanged = 0x811D0000,
   BadEdited_OutOfRange_DominantValueChanged_DependentValueChanged = 0x811E0000,
   GoodCommunicationEvent = 0x00A70000,
   GoodShutdownEvent = 0x00A80000,
   GoodCallAgain = 0x00A90000,
   GoodNonCriticalTimeout = 0x00AA0000,
   BadInvalidArgument = 0x80AB0000,
   BadConnectionRejected = 0x80AC0000,
   BadDisconnect = 0x80AD0000,
   BadConnectionClosed = 0x80AE0000,
   BadInvalidState = 0x80AF0000,
   BadEndOfStream = 0x80B00000,
   BadNoDataAvailable = 0x80B10000,
   BadWaitingForResponse = 0x80B20000,
   BadOperationAbandoned = 0x80B30000,
   BadExpectedStreamToBlock = 0x80B40000,
   BadWouldBlock = 0x80B50000,
   BadSyntaxError = 0x80B60000,
   BadMaxConnectionsReached = 0x80B70000,
   UncertainTransducerInManual = 0x42080000,
   UncertainSimulatedValue = 0x42090000,
   UncertainSensorCalibration = 0x420A0000,
   UncertainConfigurationError = 0x420F0000,
   GoodCascadeInitializationAcknowledged = 0x04010000,
   GoodCascadeInitializationRequest = 0x04020000,
   GoodCascadeNotInvited = 0x04030000,
   GoodCascadeNotSelected = 0x04040000,
   GoodFaultStateActive = 0x04070000,
   GoodInitiateFaultState = 0x04080000,
   GoodCascade = 0x04090000,
   BadDataSetIdInvalid = 0x80E70000,
}

export class StatusUtils {
   public static toCode(value: number | object | undefined): number {
      if (!value) return 0;
      let code: number | undefined = typeof value === 'number' ? value : undefined;
      if (code === undefined) {
         const field = value["code"];
         code = typeof field === 'number' ? field : undefined;
      }
      return code ?? 0;
   }
   public static toHex(code: number): string {
      let text: string = code.toString(16).toUpperCase();
      while (text.length < 8) {
         text = '0' + text;
      }
      return '0x' + text;
   }
   public static isGood(value: number | object | undefined): boolean {
      return (StatusUtils.toCode(value) & 0xD0000000) === 0;
   }
   public static isUncertain(value: number | object | undefined): boolean {
      return (StatusUtils.toCode(value) & 0x40000000) !== 0;
   }
   public static isBad(value: number | object | undefined): boolean {
      return (StatusUtils.toCode(value) & 0x80000000) !== 0;
   }
   public static codeBits(value: number | object | undefined): number {
      return (StatusUtils.toCode(value) ?? 0 & 0xFFFF0000);
   }
   public static infoBits(value: number | object | undefined): number {
      return (StatusUtils.toCode(value) ?? 0 & 0x0000FFFF);
   }
   public static toText(value: number | object | undefined): string {
      const code = StatusUtils.toCode(value);
      return Object.keys(StatusCodes).find(key => StatusCodes[key] === code) ?? StatusUtils.toHex(code);
   }
}